package Vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;

import Adaptateurs.TopeurAdaptateur;
import Controleur.ControllerInitialisation;
import Controleur.ControllerSimulation;

public class VueSimulation extends JFrame implements PlateauListener {

	private Vue_Plateau vuePlateau;
	private VueControles vueControles;
	private Barre_d_etat barreDEtat;
	private ControllerSimulation controlleur;
	
	public VueSimulation(int nbCases, ControllerSimulation cont) {
		super();
		setTitle("Déroulement de la simulation") ;
		controlleur = cont;
		this.setJMenuBar(constructMenu());
		
		JPanel general = new JPanel();
		general.setLayout(new BorderLayout());
		general.setBackground(Color.WHITE) ;
		
		vuePlateau = new Vue_Plateau(nbCases, controlleur);
		vueControles = new VueControles(controlleur);
		barreDEtat = new Barre_d_etat(controlleur);
		
		general.add(vuePlateau,BorderLayout.CENTER);
		general.add(vueControles,BorderLayout.NORTH);
		general.add(barreDEtat,BorderLayout.SOUTH);
		
		
		this.setContentPane(general);
	
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		this.setBounds(0, 0, 1280, 720);
		
	}
	
	

	private JMenuBar constructMenu()
	{
		JMenuBar jmb = new JMenuBar();
		JMenu Fichier = new JMenu("Fichier");
		
		
		JMenuItem menuQuitt = new JMenuItem("Stop et revenir");
		menuQuitt.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				controlleur.terminerSimulation() ;
			}
		});
		Fichier.add(menuQuitt);
		
		JMenuItem saveSimu = new JMenuItem("Sauvegarder la simulation");
			saveSimu.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					controlleur.sauvegarderSimulation() ;
				}
			}) ;
		Fichier.add(saveSimu);
		
		jmb.add(Fichier);
		
		return jmb;
	}

	@Override
	public void updateVue() {
		vuePlateau.updateVue();
		vueControles.updateVue();
		barreDEtat.updateVue();
		
	}
}

class VueControles extends JPanel implements PlateauListener
{
	private JLabel dureeTour;
	private JLabel nbTourSec;
	private JLabel dureeReelleTour;
	
	private JButton buttonPauseReprendre;
	private JButton buttonRalentir;
	private JButton buttonAccelerer;
	private JButton buttonJouerTour;
	
	private TopeurAdaptateur topeurAdat;
	
	public VueControles(ControllerSimulation controlleur) {
		super();
		topeurAdat = controlleur.getTopeurAdaptateur();
		controlleur.getAdaptateurPlateau().sAbonner(this);
//		this.setLayout(new GridLayout(5,1));
		
		//panel boutons controle
		JPanel boutonsControle = new JPanel();
		buttonPauseReprendre = new JButton("►");
		buttonPauseReprendre.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				topeurAdat.mettreEnPauseReprendre();
				updateVue();
			}
		});
		
		buttonRalentir = new JButton("◄◄");
		buttonRalentir.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				topeurAdat.ralentir();
			}
		});
		
		buttonAccelerer = new JButton("►►");
		buttonAccelerer.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				topeurAdat.accelerer();
			}
		});
		
		buttonJouerTour = new JButton("►|");
		buttonJouerTour.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				topeurAdat.jouerTour();
			}
		});
		
		boutonsControle.add(buttonRalentir);
		boutonsControle.add(buttonPauseReprendre);
		boutonsControle.add(buttonAccelerer);
		boutonsControle.add(buttonJouerTour);
		this.add(boutonsControle);
		
		dureeTour = new JLabel();
		dureeReelleTour= new JLabel();
		nbTourSec = new JLabel();
		setDureeTour(0);
		setNbTour(0);
		
		this.add(dureeTour);
		this.add(nbTourSec);
		this.add(dureeReelleTour);
	}
	
	public void setDureeTour(int dureeTour) {
		this.dureeTour.setText("Duree de tour: " + dureeTour + "ms");
	}
	
	public void setDureeReelleeTours(int nbTour) {
		this.dureeReelleTour.setText("Durée réelle du tour: " + nbTour + "ms");
	}
	
	public void setNbTour(int nbTour) {
		this.nbTourSec.setText("Vitesse d'execution: " + nbTour + "tour/sec");
	}
	
	

	@Override
	public void updateVue() {
		setDureeTour(topeurAdat.getTempsTour());
		setNbTour(topeurAdat.getNbTourSec());
		setDureeReelleeTours(topeurAdat.getTempsReelTour());
		
		switch (topeurAdat.getEtat()) {
		case pause:
			buttonPauseReprendre.setText("►");
			buttonRalentir.setEnabled(false);
			buttonAccelerer.setEnabled(false);
			buttonJouerTour.setEnabled(true);
			break;
		case playing:
			buttonPauseReprendre.setText("Pause");
			buttonRalentir.setEnabled(true);
			if (topeurAdat.peutAccelerer())
				buttonAccelerer.setEnabled(true);
			else
				buttonAccelerer.setEnabled(false);
			buttonJouerTour.setEnabled(false);
			break;
		default:
			break;
		}
	}
	
	
	
}
